package common;


import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import jdk.nashorn.internal.objects.annotations.Constructor;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 响应的通用实体类
 * @author Hisen
 * @date 2017/11/4
 */
@JsonSerialize
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@NoArgsConstructor
public class ServerResponse<T> implements Serializable{
  private String msg;
  private int status;
  private T data;

  private ServerResponse(int status) {
    this.status = status;
  }

  private ServerResponse(int status, T data) {
    this.status = status;
    this.data = data;
  }

  private ServerResponse(int status, String msg, T data) {
    this.msg = msg;
    this.status = status;
    this.data = data;
  }

  private ServerResponse(int status, String msg) {
    this.msg = msg;
    this.status = status;
  }

  /**
   * 被json忽略
   * @return
   */
  @JsonIgnore
  public boolean isSuccess(){
    return this.status == ResponseCode.SUCCESS.getCode();
  }

  public String getMsg() {
    return msg;
  }

  public int getStatus() {
    return status;
  }

  public T getData() {
    return data;
  }

  public static <T> ServerResponse<T> createBySuccess(){
    return new ServerResponse<T>(ResponseCode.SUCCESS.getCode());
  }

  public static <T> ServerResponse<T> createBySuccessMessage(String msg){
    return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg);
  }

  public static <T> ServerResponse<T> createBySuccess(T data){
    return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),data);
  }

  public static <T> ServerResponse<T> createBySuccess(String msg, T data){
    return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg, data);
  }

  public static <T> ServerResponse<T> createByError(){
    return new ServerResponse<T>(ResponseCode.ERROR.getCode(), ResponseCode.ERROR.getDesc());
  }

  public static <T> ServerResponse<T> createByErrorMessage(String errorMsg){
    return new ServerResponse<T>(ResponseCode.ERROR.getCode(), errorMsg);
  }

  public static <T> ServerResponse<T> createByErrorCodeMessage(int errorCode, String errorMsg){
    return new ServerResponse<T>(errorCode, errorMsg);
  }
}
